package com.zt.utils;

/**
 * 地理位置工具类
 * 用于计算两个经纬度坐标之间的距离
 */
public class GeoUtils {
    
    /**
     * 地球半径（千米）
     */
    private static final double EARTH_RADIUS = 6371.0;
    
    /**
     * 使用Haversine公式计算两个经纬度坐标之间的距离
     * 
     * @param lat1 第一个点的纬度
     * @param lon1 第一个点的经度
     * @param lat2 第二个点的纬度
     * @param lon2 第二个点的经度
     * @return 距离（千米）
     */
    public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
        // 将角度转换为弧度
        double lat1Rad = Math.toRadians(lat1);
        double lon1Rad = Math.toRadians(lon1);
        double lat2Rad = Math.toRadians(lat2);
        double lon2Rad = Math.toRadians(lon2);
        
        // 计算纬度和经度的差值
        double deltaLat = lat2Rad - lat1Rad;
        double deltaLon = lon2Rad - lon1Rad;
        
        // 使用Haversine公式
        double a = Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2) +
                   Math.cos(lat1Rad) * Math.cos(lat2Rad) *
                   Math.sin(deltaLon / 2) * Math.sin(deltaLon / 2);
        
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        
        // 计算距离
        double distance = EARTH_RADIUS * c;
        
        return distance;
    }
    
    /**
     * 格式化距离显示
     * 
     * @param distance 距离（千米）
     * @return 格式化后的距离字符串
     */
    public static String formatDistance(double distance) {
        if (distance < 1.0) {
            return String.format("%.0fm", distance * 1000);
        } else {
            return String.format("%.1fkm", distance);
        }
    }
    
    /**
     * 检查坐标是否有效
     * 
     * @param latitude 纬度
     * @param longitude 经度
     * @return 是否有效
     */
    public static boolean isValidCoordinate(Double latitude, Double longitude) {
        if (latitude == null || longitude == null) {
            return false;
        }
        
        // 纬度范围：-90 到 90
        // 经度范围：-180 到 180
        return latitude >= -90.0 && latitude <= 90.0 && 
               longitude >= -180.0 && longitude <= 180.0;
    }
}
